﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Banesco.Entidades;
using System.Xml.Serialization;
using System.Xml.Linq;
using System.Xml;
using Banesco.Logica.ServicesIntegracionCoreBancaria;
using System.IO;
using System.Data;
using System.Collections;


///Core Business Layer
namespace Banesco.Logica
{
    public class HelperDB
    {
        #region Fields
        IntegracionInformacionCustomerServicesCNatural msgNatural = new IntegracionInformacionCustomerServicesCNatural();
        IntegracionInformacionCustomerServicesCJuridico msgJuridico = new IntegracionInformacionCustomerServicesCJuridico();
        AdditionalInformation msgAditional = new AdditionalInformation();

        AccountServicesIntegration msgAccount = new AccountServicesIntegration();

        #endregion

        #region Properties
        public UsuarioBase Usuario { get; set; }

        public DataRow UsuarioTabla { get; set; }
        public TipoCliente TCliente { get; set; }
        #endregion

        #region Constructor
        public HelperDB() { }
        public HelperDB(UsuarioBase user, TipoCliente tCliente)
        {
            Usuario = user;
            TCliente = tCliente;
        }

        public HelperDB(DataRow user, TipoCliente tCliente, UsuarioBase userbase)
        {
            UsuarioTabla = user;
            TCliente = tCliente;
            Usuario = userbase;
        }


        #endregion

        #region Methods



        public string msgInformation(bool hasIssue, bool isAccount, ref object msg)
        {
            string msgString = string.Empty;

            if (isAccount)
            {
                return msgCuentaRequest();
            }
            else
            {
                if (TCliente == TipoCliente.Natural)
                {
                    IntegracionInformacionCustomerServicesCNatural natural = new IntegracionInformacionCustomerServicesCNatural();
                    msgString = msgNaturalRequest(hasIssue, out natural);
                    msg = natural;
                    return msgString;
                }
                else
                {
                    IntegracionInformacionCustomerServicesCJuridico juri = new IntegracionInformacionCustomerServicesCJuridico();
                    msgString = msgJuridicoRequest(hasIssue, out juri);
                    msg = juri;
                    return msgString;
                }
            }


        }

        public string formatoIdentificacion(string identificacion)
        {
            string formatoCompleto = "";
            bool primeraletra = false;
            string[] numeros;


            if ((identificacion.Substring(0, 1) == "0") || (identificacion.Substring(0, 1) == "1") || (identificacion.Substring(0, 1) == "2") || (identificacion.Substring(0, 1) == "3") || (identificacion.Substring(0, 1) == "4") || (identificacion.Substring(0, 1) == "5") || (identificacion.Substring(0, 1) == "6") || (identificacion.Substring(0, 1) == "7") || (identificacion.Substring(0, 1) == "8") || (identificacion.Substring(0, 1) == "9"))
            {
                primeraletra = false;
            }
            else
            {
                primeraletra = true;
            }

            if (primeraletra)
            {
                if (identificacion.Substring(0, 1) == "E")
                {
                    numeros = identificacion.Split('-');
                    formatoCompleto = "00-E-" + completarCeros(numeros[1], 5) + "-" + completarCeros(numeros[2], 6);
                }
                else if (identificacion.Substring(0, 1) == "N")
                {
                    numeros = identificacion.Split('-');
                    formatoCompleto = "00-N-" + completarCeros(numeros[1], 5) + "-" + completarCeros(numeros[2], 6);
                }
                else if (identificacion.Substring(0, 1) == "P")
                {
                    numeros = identificacion.Split('-');
                    formatoCompleto = "00-PE-" + completarCeros(numeros[1], 5) + "-" + completarCeros(numeros[2], 6);
                }
                else
                {
                    formatoCompleto = identificacion;
                }
            }
            else
            {

                numeros = identificacion.Split('-');
                if (numeros.Length == 4)
                {
                    formatoCompleto = completarCeros(numeros[0], 2) + "-" + numeros[1] + "-" + completarCeros(numeros[2], 5) + "-" + completarCeros(numeros[3], 6);
                }
                else if (numeros.Length == 3)
                {
                    formatoCompleto = completarCeros(numeros[0], 2) + "--" + completarCeros(numeros[1], 5) + "-" + completarCeros(numeros[2], 6);
                }
                else
                {
                    formatoCompleto = identificacion;
                }

            }

            return formatoCompleto;

        }

        public string formatoNumeroRegistro(string NumeroRegistro)
        {
            string formatoCompleto = "";
            string[] numeros;

            numeros = NumeroRegistro.Split('-');
            if (numeros.Length == 3)
            {
                formatoCompleto = completarCeros(numeros[0], 7) + "-" + completarCeros(numeros[1], 4) + "-" + completarCeros(numeros[2], 8);
            }
            else
            {
                formatoCompleto = NumeroRegistro;
            }
            return formatoCompleto;
        }

        private string completarCeros(string numero, int cantidad)
        {
            string completado = "";
            int largo = numero.Length;

            for (int c = 1; c <= cantidad - largo; c++)
            {
                completado += "0";
            }
            completado += numero;
            return completado;
        }

        public List<AdditionalInformation> msgAdditionInfoRequest(Dictionary<string, DataTable> dColl)
        {
            List<AdditionalInformation> CollectionMsg = new List<AdditionalInformation>();
            foreach (KeyValuePair<string, DataTable> item in dColl)
            {
                string valueType = item.Key.ToString();
                AdditionalInformation IA = new AdditionalInformation();
                foreach (var itemarrys in item.Value.AsEnumerable())
                {

                    if (item.Key == "Beneficiario")
                    {
                        IA.addressLine = itemarrys.Field<string>("Direccion");
                        IA.addessLine1 = "";
                        IA.addressLine = itemarrys.Field<string>("Direccion");
                        IA.addressType = "";
                        IA.birthDate = DateTime.Today.ToString();
                        IA.building = "";
                        IA.citizenship = "";
                        IA.citizenshipDesc = "";
                        IA.city = "";
                        IA.cityDesc = "";
                        IA.country = "PA";
                        IA.countryDesc = "PA";
                        IA.customerNumber = "0";
                        IA.district = "101";
                        IA.districtDesc = "101";
                        IA.entryDate = DateTime.Today.ToString();
                        IA.floorLevel = "";
                        IA.fullName = itemarrys.Field<string>("Nombre");
                        IA.gender = "M";
                        IA.houseNumber = "";
                        IA.idCountry = "PA";
                        IA.idCountryDesc = "PA";
                        IA.idNumber = itemarrys.Field<string>("Identificacion");
                        IA.idType = "";
                        IA.idTypeDesc = "";
                        IA.legalName = itemarrys.Field<string>("Nombre");
                        IA.mailingCode = "";
                        IA.mailingCodeDesc = "";
                        IA.maritalStatus = "";
                        IA.marketPrice = "1";
                        IA.marriedName = "";
                        IA.municipality = "1001";
                        IA.numberStocks = "1";
                        IA.phone = itemarrys.Field<string>("Telefono").Replace("-", string.Empty);
                        IA.poBox = "";
                        IA.position = "";
                        IA.positionDesc = "";
                        IA.purchasedPrice = "1";
                        IA.recordType = "4";
                        IA.region = "";
                        IA.regionDesc = "";
                        IA.relatedCustomer = "1";
                        IA.relationType = "";
                        IA.sequence = "1";
                        IA.signerType = "";
                        IA.state = "01";
                        IA.stateDesc = "01";
                        IA.street = "";
                        IA.unitNumber = "";
                        IA.zipCode = "";
                        CollectionMsg.Add(IA);
                    }
                    else if (item.Key == "Referencias")
                    {
                        IA.addessLine1 = itemarrys.Field<string>("Direccion") == string.Empty ? itemarrys.Field<string>("Pais") : itemarrys.Field<string>("Direccion");
                        IA.addressLine = itemarrys.Field<string>("Direccion") == string.Empty ? itemarrys.Field<string>("Pais") : itemarrys.Field<string>("Direccion");
                        IA.addressType = "";
                        IA.birthDate = DateTime.Today.ToString();
                        IA.building = "";
                        IA.citizenship = itemarrys.Field<string>("Pais");
                        IA.citizenshipDesc = "";
                        IA.city = itemarrys.Field<string>("Ciudad") == string.Empty ? itemarrys.Field<string>("Pais") : itemarrys.Field<string>("Ciudad");
                        IA.cityDesc = itemarrys.Field<string>("Ciudad");
                        IA.country = itemarrys.Field<string>("Pais");
                        IA.countryDesc = itemarrys.Field<string>("Pais");
                        IA.customerNumber = "0";
                        IA.district = "101";//  itemarrys.Field<string>("Distrito");
                        IA.districtDesc = itemarrys.Field<string>("Distrito");
                        IA.entryDate = DateTime.Today.ToString();
                        IA.floorLevel = "";
                        IA.fullName = itemarrys.Field<string>("Nombre");
                        IA.gender = "M";
                        IA.houseNumber = itemarrys.Field<string>("NumeroCasa");
                        IA.idCountry = itemarrys.Field<string>("Pais");
                        IA.idCountryDesc = itemarrys.Field<string>("Pais");
                        IA.idNumber = "01-00011-000011";
                        IA.idType = "CIP";
                        IA.idTypeDesc = "";
                        IA.legalName = itemarrys.Field<string>("Nombre");
                        IA.mailingCode = "";
                        IA.mailingCodeDesc = "";
                        IA.maritalStatus = "2";
                        IA.marketPrice = "1";
                        IA.marriedName = "";
                        IA.municipality = "1001";// itemarrys.Field<string>("Corregimiento");
                        IA.numberStocks = "1";
                        IA.phone = itemarrys.Field<string>("Telefono").Replace("-", string.Empty);
                        IA.poBox = itemarrys.Field<string>("ApartadoPostal");
                        IA.position = "";
                        IA.positionDesc = "";
                        IA.purchasedPrice = "1";
                        IA.recordType = "P";
                        IA.region = "";
                        IA.regionDesc = "";
                        IA.relatedCustomer = "1";
                        IA.relationType = "";
                        IA.sequence = "1";
                        IA.signerType = "";
                        IA.state = "01";// itemarrys.Field<string>("Provincia");
                        IA.stateDesc = itemarrys.Field<string>("Provincia");
                        IA.street = itemarrys.Field<string>("Calle");
                        IA.unitNumber = "";
                        IA.zipCode = "";
                        CollectionMsg.Add(IA);
                    }
                    else if (item.Key == "ARJ")
                    {
                        IA.addessLine1 = itemarrys.Field<string>("DireccionPrincipal") == string.Empty ? itemarrys.Field<string>("Pais") : itemarrys.Field<string>("DireccionPrincipal");
                        IA.addressLine = itemarrys.Field<string>("DireccionPrincipal") == string.Empty ? itemarrys.Field<string>("Pais") : itemarrys.Field<string>("DireccionPrincipal");
                        IA.addressType = "";
                        IA.birthDate = DateTime.Today.ToString();
                        IA.building = "";
                        IA.citizenship = "";
                        IA.citizenshipDesc = "";
                        IA.city = "";// itemarrys.Field<string>("Ciudad");
                        IA.cityDesc = "";// itemarrys.Field<string>("Ciudad");
                        IA.country = itemarrys.Field<string>("Pais");
                        IA.countryDesc = itemarrys.Field<string>("Pais");
                        IA.customerNumber = "0";
                        IA.district = "101";// itemarrys.Field<string>("Distrito");
                        IA.districtDesc = itemarrys.Field<string>("Distrito");
                        IA.entryDate = DateTime.Today.ToString();
                        IA.floorLevel = "";
                        IA.fullName = itemarrys.Field<string>("NombreDirectivo");
                        IA.gender = itemarrys.Field<string>("Sexo");
                        IA.houseNumber = itemarrys.Field<string>("NumeroCasa");
                        IA.idCountry = itemarrys.Field<string>("Pais");
                        IA.idCountryDesc = itemarrys.Field<string>("Pais");
                        IA.idNumber = itemarrys.Field<string>("Identificacion");
                        IA.idType = "";
                        IA.idTypeDesc = "";
                        IA.legalName = "";
                        IA.mailingCode = "";
                        IA.mailingCodeDesc = "";
                        IA.maritalStatus = "";
                        IA.marketPrice = "1";
                        IA.marriedName = "";
                        IA.municipality = "1001";//itemarrys.Field<string>("Corregimiento");
                        IA.numberStocks = "1";
                        IA.phone = itemarrys.Field<string>("Telefono").Replace("-", string.Empty);
                        IA.poBox = "";//itemarrys.Field<string>("ApartadoPostal");
                        IA.position = "";
                        IA.positionDesc = "";
                        IA.purchasedPrice = "1";
                        IA.recordType = itemarrys.Field<string>("EsRepresentanteLegal").ToString() == "S" ? "5" : "3";
                        IA.region = "";
                        IA.regionDesc = "";
                        IA.relatedCustomer = "1";
                        IA.relationType = "";
                        IA.sequence = "1";
                        IA.signerType = "";
                        IA.state = "01";// itemarrys.Field<string>("Provincia");
                        IA.stateDesc = "01";// itemarrys.Field<string>("Provincia");
                        IA.street = itemarrys.Field<string>("Calle");
                        IA.unitNumber = "";
                        IA.zipCode = "";
                        CollectionMsg.Add(IA);
                    }

                }

            }

            return CollectionMsg;

        }

        private string msgNaturalRequest(bool isTitu, out IntegracionInformacionCustomerServicesCNatural nat)
        {
            #region Filler
            msgNatural.addressLine = "";

            msgNatural.birthDateDay = isTitu == true ? Convert.ToDateTime(UsuarioTabla.Field<DateTime>("FechaDeNacimiento")).Day.ToString() : Usuario.FechaDeNacimiento.Day.ToString();
            msgNatural.birthDateMonth = isTitu == true ? Convert.ToDateTime(UsuarioTabla.Field<DateTime>("FechaDeNacimiento")).Month.ToString() : Usuario.FechaDeNacimiento.Month.ToString();
            msgNatural.birthDateYear = isTitu == true ? Convert.ToDateTime(UsuarioTabla.Field<DateTime>("FechaDeNacimiento")).Year.ToString() : Usuario.FechaDeNacimiento.Year.ToString();

            msgNatural.birthDate = msgNatural.birthDateDay + (msgNatural.birthDateMonth.Length == 1 ? msgNatural.birthDateMonth.PadLeft(2, '0') : msgNatural.birthDateMonth) + msgNatural.birthDateYear;

            msgNatural.branch = "";
            msgNatural.businessCode = ""; // Usuario.TipoDeActividad;
            msgNatural.businessCodeDesc = "";
            msgNatural.businessType = ""; // Usuario.TipoEmpresa;
            msgNatural.businessTypeDesc = "";
            msgNatural.celularPhoneNum = (isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Telefono2")) : Usuario.TelefonoCelular).Replace("-", string.Empty);
            msgNatural.channelType = "";
            msgNatural.channelTypeDesc = "";
            msgNatural.city = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Ciudad")) : Usuario.Ciudad;
            msgNatural.classification = "";
            msgNatural.classificationDesc = "";
            msgNatural.classificationForm = "2";
            msgNatural.clientClass = "";
            msgNatural.clientStatus = "1";
            msgNatural.clientType = "R";
            msgNatural.companyAddress = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("DireccionEmpleo")) : Usuario.DireccionEmpleo;
            msgNatural.companyCharges = "";
            msgNatural.companyInfo = "";
            msgNatural.companyName = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("NombreEmpresa")) : Usuario.NombreEmpresa;
            msgNatural.companyType = "";
            msgNatural.companyRuc = isTitu == true ? string.Empty : Usuario.NoRegistroDeSociedad;
            msgNatural.contractType = "";
            msgNatural.correg = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Corregimiento")) : Usuario.Corregimiento;
            msgNatural.corregDesc = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Corregimiento")) : Usuario.Corregimiento;
            msgNatural.country = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgNatural.countryDesc = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgNatural.countryOfBirth = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgNatural.countryOfBirthDesc = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgNatural.currentIncome = isTitu == true ? Convert.ToString(UsuarioTabla.Field<Decimal>("SalarioActual")) : Usuario.SalarioActual.ToString();
            msgNatural.currentJEntryDate = "0";
            msgNatural.currentJEntryDay = "";
            msgNatural.currentJEntryYear = "";
            msgNatural.customerNumber = "0";
            msgNatural.customerType = "2";
            msgNatural.customerTypeSel = "";
            msgNatural.dependents = "1";
            msgNatural.debitCard = "";
            msgNatural.discountCompanyCode = "";
            msgNatural.discountCompanyDsc = "";
            msgNatural.distrit = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Distrito")) : Usuario.Distrito;
            msgNatural.distritDesc = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Distrito")) : Usuario.DistritoEmpleo;
            msgNatural.educationLevel = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("NivelEducacion")) : Usuario.NivelEducacion;
            msgNatural.educationLevelDesc = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("NivelEducacion")) : Usuario.NivelEducacion;
            msgNatural.educationalExpenses = "";

            msgNatural.email = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Email")) : Usuario.Email;
            msgNatural.employeeNumber = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("NumeroDeEmpleado")) : Usuario.NumeroDeEmpleado;
            msgNatural.employmentTime = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("TiempoDeEmpleo")) : Usuario.TiempoDeEmpleo; //esta dos veces ?
            msgNatural.employmentTime = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("TiempoDeEmpleo")) : Usuario.TiempoDeEmpleo;
            msgNatural.familiarRelationType = "";
            msgNatural.faxNumber = (isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("TelefonoFax")) : Usuario.TelefonoFax).Replace("-", string.Empty);
            msgNatural.firstContactDateDay = isTitu == true ? Convert.ToDateTime(UsuarioTabla.Field<DateTime>("FechaDeNacimiento")).Day.ToString() : Usuario.FechaRegistro.Day.ToString();
            msgNatural.firstContactDateMont = isTitu == true ? Convert.ToDateTime(UsuarioTabla.Field<DateTime>("FechaDeNacimiento")).Month.ToString() : Usuario.FechaRegistro.Month.ToString();
            msgNatural.firstContactDateYear = isTitu == true ? Convert.ToDateTime(UsuarioTabla.Field<DateTime>("FechaDeNacimiento")).Year.ToString() : Usuario.FechaRegistro.Year.ToString();
            msgNatural.firstLastName = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("PrimerApellido")) : Usuario.PrimerApellido;
            msgNatural.firstName = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("PrimerNombre")) : Usuario.PrimerNombre;
            msgNatural.floorLevel = "";
            msgNatural.fuente = "";
            msgNatural.groupNumber = "0";
            msgNatural.houseNumber = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("NumeroCasa")) : Usuario.NumeroCasa;
            msgNatural.housePhoneNum = (isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Telefono1")) : Usuario.TelefonoCasa).Replace("-", string.Empty);
            msgNatural.idCountry = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgNatural.idContraloria = "";// Usuario.NumeroContraloria;
            msgNatural.idCountry4 = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgNatural.idCountryDesc4 = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgNatural.idNumber = formatoIdentificacion(isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Identificacion")) : Usuario.Identificacion);
            msgNatural.idNumber4 = "";
            msgNatural.idType = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("TipoIdentificacion")) : Usuario.TipoIdentificacion;
            msgNatural.idType4 = "";
            msgNatural.idTypeDesc = "";
            msgNatural.idTypeDesc4 = "";
            msgNatural.incomeLevel = "";
            msgNatural.incomeSource = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("FuenteDeIngreso")) : Usuario.FuenteDeIngreso;
            msgNatural.incomeSourceDesc = "";
            msgNatural.indicador = "";
            msgNatural.industryCode = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("CodigoIndustria")) : Usuario.CodigoIndustria;
            msgNatural.industryCodeDesc = "";
            msgNatural.inquiryLevel = "0";
            msgNatural.language = "S";
            msgNatural.legalName = isTitu == true ? String.Empty : Usuario.NombreLegal;
            msgNatural.legalStatus = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("EstadoCivil")) : Usuario.EstadoCivil;
            msgNatural.longIdNumber = "";
            msgNatural.longIdTypeDesc = "";
            msgNatural.mailingCode = "";
            msgNatural.mailingCodeDesc = "";
            msgNatural.mainOfficer = "0001";
            msgNatural.mainOfficerDesc = "";
            msgNatural.marriedName = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("ApellidoDeCasada")) : Usuario.ApellidoDeCasada;//;
            msgNatural.municipality = "";
            msgNatural.municipalityDesc = "";
            msgNatural.nationality = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgNatural.nacionalityDesc = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgNatural.netPatrimony = "";
            msgNatural.officeNumber = "";
            msgNatural.officePhoneNum = (isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("TelefonoOficina")) : Usuario.TelefonoOficina == "0" ? "1" : Usuario.TelefonoOficina).Replace("-", string.Empty);
            msgNatural.otherExpenses = "";
            msgNatural.otherIncome = "";
            msgNatural.otherIncomeSource = "";
            msgNatural.parish = "";
            msgNatural.parishDesc = "";
            msgNatural.payDay = "";
            msgNatural.poBox = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("ApartadoPostal")) : Usuario.ApartadoPostal;
            msgNatural.position = "";
            msgNatural.positionDesc = "";
            msgNatural.previousJEndDay = "0";
            msgNatural.previousJEndMonth = "0";
            msgNatural.previousJEndYear = "0";
            msgNatural.previousJEntryDay = "0";
            msgNatural.previousJEntryMonth = "0";
            msgNatural.previousJEntryYear = "0";
            msgNatural.previsionTable = "";
            msgNatural.profession = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Profesion")) : Usuario.Profesion;
            msgNatural.professionDesc = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Profesion")) : Usuario.Profesion;
            msgNatural.propertyType = "";
            msgNatural.province = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Provincia")) : Usuario.Provincia;
            msgNatural.provinceDesc = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Provincia")) : Usuario.Provincia;
            msgNatural.referBy = "";
            msgNatural.referByDesc = "";
            msgNatural.referByName = "";
            msgNatural.relation = "R131";
            msgNatural.relationDesc = "";
            msgNatural.relationType = "1";
            msgNatural.rentAmount = "";
            msgNatural.rentType = "";
            msgNatural.residencyCountry = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgNatural.residencyCountryDesc = "";
            msgNatural.resident = ((isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais) == "PA" ? "1" : "2");
            msgNatural.riskLevel = "";
            msgNatural.riskLevelDesc = "";
            msgNatural.salesChannel = "";
            msgNatural.salesChannelDesc = "";
            msgNatural.secondIdCountry = "";
            msgNatural.secondIdCountryDesc = "";
            msgNatural.secondIdNumber = "";
            msgNatural.secondIdType = "";
            msgNatural.secondIdTypeDesc = "";
            msgNatural.secondLastName = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("SegundoApellido")) : Usuario.SegundoApellido;
            msgNatural.secondName = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("SegundoNombre")) : Usuario.SegundoNombre;
            msgNatural.secondOfficer = "0001";
            msgNatural.secondOfficerDesc = "";
            msgNatural.sex = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Sexo")) : Usuario.Sexo;
            msgNatural.shortIdCountry = "";
            msgNatural.shortIdNumber = "";
            msgNatural.shortIdType = "";
            msgNatural.shortName = "";
            msgNatural.specialInstructions = new string[] { };
            string pais = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            string calle = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Calle")) : Usuario.Calle;
            string direccion = isTitu == true ? Convert.ToString(UsuarioTabla.Field<String>("Direccion")) : Usuario.Direccion;
            if ((pais == "PA") || (pais == "VE"))
                msgNatural.street = calle;
            else
                msgNatural.street = direccion;
            msgNatural.taxes = "4";
            msgNatural.user = "user";
            msgNatural.zipCode = "";
            #endregion
            nat = msgNatural;
            XDocument xdoc = Serialize<IntegracionInformacionCustomerServicesCNatural>(msgNatural);
            XmlDocument docXml = xdoc.toXmlDocument();
            return docXml.InnerXml;
        }

        private string msgJuridicoRequest(bool isFirm, out IntegracionInformacionCustomerServicesCJuridico jur)
        {
            #region Filler
            msgJuridico.addressLine1 = isFirm == true ? Convert.ToString(UsuarioTabla.Field<String>("Direccion")) : Usuario.Direccion;
            msgJuridico.addressLine2 = "";
            msgJuridico.addressLine3 = "";
            msgJuridico.addressVerbalRef = "";
            msgJuridico.appPending = "";
            msgJuridico.aptoOffice = "";
            msgJuridico.automaticAppFlag = "";
            msgJuridico.bankingType = "";
            msgJuridico.building = "";
            msgJuridico.businessArea = "";
            msgJuridico.businessCode = "";
            msgJuridico.businessCodeDesc = "";
            msgJuridico.businessTypeDesc = "";
            msgJuridico.businessUnity = "";
            msgJuridico.capitalPaid = "";
            msgJuridico.celularPhoneNumber = "";//Usuario.Celular;
            msgJuridico.city = Usuario.Ciudad;
            msgJuridico.classification = "";
            msgJuridico.classificationDesc = "";
            msgJuridico.classificationForm = "";
            msgJuridico.clientClass = "";
            msgJuridico.clientOperativeType = "R";
            msgJuridico.clientStatus = "1"; //Verificar
            msgJuridico.companySize = "";
            msgJuridico.condominium = "";
            msgJuridico.correg = isFirm == true ? Convert.ToString(UsuarioTabla.Field<String>("Corregimiento")) : Usuario.Corregimiento;
            msgJuridico.corregDesc = "";
            msgJuridico.country = isFirm == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgJuridico.countryOfBirthDesc = "";
            msgJuridico.customerNumber = "";
            msgJuridico.customerType = "";
            msgJuridico.debitCardNumber = "1";
            msgJuridico.discountCompanyDesc = "";
            msgJuridico.distrit = Usuario.Distrito;
            msgJuridico.distritDesc = "";
            msgJuridico.educationLevelDesc = "";// Usuario.NivelEducativo;
            msgJuridico.email = Usuario.Email;
            msgJuridico.faxNumber = "";// Usuario.fax;
            msgJuridico.firstContact = Usuario.FechaInicioOperaciones.ToShortDateString(); //no tengo esta fecha 
            msgJuridico.floorLevel = "";
            msgJuridico.folioNumber = "";
            msgJuridico.foundation = Usuario.FechaRegistro.ToShortDateString(); //no tengo esta fecha
            msgJuridico.fourthIdCountry = "";
            msgJuridico.fourthIdCountryDesc = "";
            msgJuridico.fourthIdNumber = "";
            msgJuridico.fourthIdType = "";
            msgJuridico.fourthIdTypeDesc = "";
            msgJuridico.groupNumber = "";
            msgJuridico.idCountry = isFirm == true ? Convert.ToString(UsuarioTabla.Field<String>("Pais")) : Usuario.Pais;
            msgJuridico.idCountryDesc = "";
            msgJuridico.idNumber = formatoNumeroRegistro(Usuario.NoRegistroDeSociedad); //no tengo este dato
            msgJuridico.idType = "";
            msgJuridico.idTypeDesc = "";
            msgJuridico.incomeSource = "";
            msgJuridico.incomeSourceDesc = "";
            msgJuridico.industryCode = "1040";
            msgJuridico.industryCodeDesc = "";
            msgJuridico.initialCapital = "";
            msgJuridico.inquiryLevel = "";
            msgJuridico.inscription = Usuario.FechaRegistro.ToShortDateString(); //no tengo esta fecha
            msgJuridico.inscriptionNumber = "";
            msgJuridico.juridicalDistrict = "";
            msgJuridico.languageIndicator = "";
            msgJuridico.legalName = Usuario.NombreLegal; //no tengo esta fecha
            msgJuridico.mailingCode = "";
            msgJuridico.mailingCodeDesc = "";
            msgJuridico.mainOfficer = "0001";
            msgJuridico.mainOfficerDesc = "";
            msgJuridico.moreRecords = "";
            msgJuridico.municipality = "";
            msgJuridico.municipalityDesc = "";
            msgJuridico.nacionalityDesc = "";
            msgJuridico.nationality = Usuario.PaisRegistroSociedad; //no tengo esta fecha
            msgJuridico.numberOfShears = "";
            msgJuridico.officePhoneNumber1 = (isFirm == true ? Convert.ToString(UsuarioTabla.Field<String>("Telefono1")) : Usuario.TelefonoCasa).Replace("-", "");
            msgJuridico.officePhoneNumber2 = (isFirm == true ? Convert.ToString(UsuarioTabla.Field<String>("Telefono2")) : Usuario.TelefonoCelular).Replace("-", "");
            msgJuridico.originCountry = Usuario.PaisRegistroSociedad; //no tengo este dato
            msgJuridico.ownershipType = "";
            msgJuridico.parish = "";
            msgJuridico.parishDesc = "";
            msgJuridico.poBox = isFirm == true ? Convert.ToString(UsuarioTabla.Field<String>("ApartadoPostal")) : Usuario.ApartadoPostal;
            msgJuridico.portfolioType = "";
            msgJuridico.positionDesc = "";
            msgJuridico.previousName = "";
            msgJuridico.previsionTable = "00";
            msgJuridico.propertyType = "";
            msgJuridico.provinceDesc = "";
            msgJuridico.referBy = "";
            msgJuridico.referByDesc = "";
            msgJuridico.referByName = "";
            msgJuridico.reference = "";
            msgJuridico.region = "";
            msgJuridico.registerNumber = "";
            msgJuridico.relation = "R131";//Verificar
            msgJuridico.relationDesc = "";
            msgJuridico.residencyCountry = "";
            msgJuridico.residencyCountryDesc = "";
            msgJuridico.residentFlag = "";
            msgJuridico.riskCentral = "";
            msgJuridico.riskLevel = "";
            msgJuridico.riskLevelDesc = "";
            msgJuridico.rollOverVolume = "";
            msgJuridico.salesLevel = "";
            msgJuridico.secondIdCountry = "";
            msgJuridico.secondIdCountryDesc = "";
            msgJuridico.secondIdNumber = "";
            msgJuridico.secondIdType = "";
            msgJuridico.secondIdTypeDesc = "";
            msgJuridico.secondOfficer = "0002";
            msgJuridico.secondOfficerDesc = "";
            msgJuridico.shortName = Usuario.NombreComercial; //no tengo este dato
            msgJuridico.socioEconomicLevel = "";
            msgJuridico.specialInstructions = "";
            msgJuridico.state = isFirm == true ? Convert.ToString(UsuarioTabla.Field<String>("Provincia")) : Usuario.Provincia;
            msgJuridico.stockHolders = "";
            msgJuridico.street = isFirm == true ? Convert.ToString(UsuarioTabla.Field<String>("Calle")) : Usuario.Calle;
            msgJuridico.subscribedCapital = "";
            msgJuridico.taxes = "4";//Verificar
            msgJuridico.thirdIdCountry = "";
            msgJuridico.thirdIdCountryDesc = "";
            msgJuridico.thirdIdNumber = "";
            msgJuridico.thirdIdType = "";
            msgJuridico.thirdIdTypeDesc = "";
            msgJuridico.typeOfCorresBank = "";
            msgJuridico.user = "USER";//si no me equivoco es el usuario que ingresa la consulta ...
            msgJuridico.userCode6Desc = "";
            msgJuridico.userCode9Desc = "";
            msgJuridico.volumeNumber = "";
            msgJuridico.yearsBusiness = "";
            msgJuridico.zipCode = "";
            #endregion
            jur = msgJuridico;
            XDocument xdoc = Serialize<IntegracionInformacionCustomerServicesCJuridico>(msgJuridico);
            XmlDocument docXml = xdoc.toXmlDocument();
            return docXml.InnerXml;
        }

        private string msgCuentaRequest()
        {
            #region Filler
            msgAccount.user = "USER";
            msgAccount.accountNumber = "";
            msgAccount.customerNumber = "";
            msgAccount.customerId = "";
            msgAccount.productCode = "";
            msgAccount.bank = "";
            msgAccount.currency = "";
            msgAccount.branch = "";
            msgAccount.glAccount = "";
            msgAccount.customerName = "";
            msgAccount.accountType = "";
            msgAccount.accountTypeDesc = "";
            msgAccount.productCodeDesc = "";
            msgAccount.appCode = "";
            msgAccount.officialCode = "";
            msgAccount.costCenter = "";
            msgAccount.openingDate = "";
            msgAccount.tariffTable = "";
            msgAccount.userCode1 = "";
            msgAccount.userCode2 = "";
            msgAccount.userCode3 = "";
            msgAccount.userCode4 = "";
            msgAccount.taxesWitholdingFlag = "";
            msgAccount.checkingType = "";
            msgAccount.minimumCheckingStock = "";
            msgAccount.serviceChargesFlag = "";
            msgAccount.overdraftsChargesFlag = "";
            msgAccount.overdraftAmountUsed = "";
            msgAccount.overdraftFrecuency = "";
            msgAccount.chargesPaymentDay = "";
            msgAccount.accountStatementRetentionFlag = "";
            msgAccount.accountStatementFrecuency = "";
            msgAccount.accountStatementPrintingDay = "";
            msgAccount.accountStatementType = "";
            msgAccount.consolidatedStatementFlag = "";
            msgAccount.dailyStatementAccountVia = "";
            msgAccount.clientLinMultiuse = "";
            msgAccount.clientLinNumber = "";
            msgAccount.sendingChannel = "";
            msgAccount.personalizationCheck1 = "";
            msgAccount.personalizationCheck2 = "";
            msgAccount.checkingChargesFlag = "";
            msgAccount.checkingChargesRestriction = "";
            msgAccount.interestPaymentFlag = "";
            msgAccount.accountStatus = "";
            msgAccount.mailingAddress = "";
            msgAccount.creditLineNumber = "";
            msgAccount.creditLineType = "";
            msgAccount.balanceUsedForOverdraft = "";
            msgAccount.limitValueOverdraft1 = "";
            msgAccount.limitValueOverdraft2 = "";
            msgAccount.overrateForOverdraft1 = "";
            msgAccount.overrateForOverdraft2 = "";
            msgAccount.relatedGlAccountBank = "";
            msgAccount.relatedGlAccountBranch = "";
            msgAccount.relatedGlAccountCurrency = "";
            msgAccount.relatedGlAccount = "";
            msgAccount.relatedDetailAccount = "";
            msgAccount.relatedProduct = "";
            msgAccount.creditLineClient = "";
            msgAccount.creditLineLimit = "";
            msgAccount.creditLineRevisionDate = "";
            msgAccount.personalizedNameForCheckbook = "";
            msgAccount.personalizedNameRelation = "";
            msgAccount.personalizedNameForCheckbook2 = "";
            msgAccount.checkbookType = "";
            msgAccount.checkbookDeliveryRestrictionsFlag = "";
            msgAccount.specialInstructions = new string[] { };


            #endregion

            XDocument xdoc = Serialize<AccountServicesIntegration>(msgAccount);
            XmlDocument docXml = xdoc.toXmlDocument();
            return docXml.InnerXml;
        }

        public static XDocument Serialize<X>(X para)
        {
            XmlSerializer xmlSerial = new XmlSerializer(typeof(X));
            XDocument xDoc = new XDocument();
            using (var Writer = xDoc.CreateWriter())
            {
                xmlSerial.Serialize(Writer, para);
            }
            return xDoc;
        }

        public static T Deserialize<T>(XDocument xDoc)
        {
            XmlSerializer xmlSerial = new XmlSerializer(typeof(T));
            using (var Reader = xDoc.Root.CreateReader())
            {
                return (T)xmlSerial.Deserialize(Reader);
            }
        }

        #endregion
    }

    public class Core
    {
        #region Properties

        private object Request { get; set; }

        private string User { get; set; }

        private string Country { get; set; }

        private string IdCliente { get; set; }

        private TipoCliente TCliente { get; set; }

        private XDocument requestDoc { get; set; }

        #endregion

        #region Constructor

        public Core()
        {

        }

        public Core(string idCliente, string user, string country, TipoCliente tipoCliente, object request)
        {
            User = user;
            IdCliente = idCliente;
            Country = country;
            TCliente = tipoCliente;
            Request = request;
        }

        public Core(string idCliente, string user, object request)
        {
            User = user;
            Request = request;
        }

        #endregion

        #region Methods


        public List<string> StartCustomerFlow(object addition, object firmTit, out bool wasAccountInserted)
        {
            bool succeedFlow = false;
            XDocument response = null;
            List<string> msgList = new List<string>();
            List<string> FirmList = new List<string>();
            string customerNumber = string.Empty;
            string nombre = string.Empty;
            string apellido = string.Empty;
            wasAccountInserted = false;
            string cuenta = string.Empty;

            if (SearchInformation(User, IdCliente, Country, TCliente, ref response, out customerNumber))
            {

                succeedFlow = UpdateInCore(Request, TCliente, ref response, customerNumber);
                if (TCliente == TipoCliente.Natural)
                {

                    if (succeedFlow)
                    {
                        nombre = response.Root.Elements().ElementAt(59).Value;
                        apellido = response.Root.Elements().ElementAt(58).Value;
                        msgList.Add("<RESUMEN><Nombre>" + nombre + "</Nombre><Apellido>" + apellido + "</Apellido><Estado>Actualizacion exitosa</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                    }
                    else
                    {
                        nombre = requestDoc.Root.Elements().ElementAt(59).Value;
                        apellido = requestDoc.Root.Elements().ElementAt(58).Value;
                        msgList.Add("<RESUMEN><Nombre>" + nombre + "</Nombre><Apellido>" + apellido + "</Apellido><Estado>Actualizacion No exitosa</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                    }
                }
                else
                {
                    if (succeedFlow)
                    {
                        nombre = response.Root.Elements().ElementAt(63).Value;
                        apellido = response.Root.Elements().ElementAt(110).Value;
                        msgList.Add("<RESUMEN><NombreLegal>" + nombre + "</NombreLegal><NombreComercial>" + apellido + "</NombreComercial><Estado>Actualizacion exitosa</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                    }
                    else
                    {
                        nombre = response.Root.Elements().ElementAt(63).Value;
                        apellido = response.Root.Elements().ElementAt(110).Value;
                        msgList.Add("<RESUMEN><NombreLegal>" + nombre + "</NombreLegal><NombreComercial>" + apellido + "</NombreComercial><Estado>Actualizacion No exitosa</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                    }
                }
                wasAccountInserted = AccountFlow(User, customerNumber, "PN90", "1", "CAHO", "10101010", ref response, ref cuenta);
               FirmList= FirmantesTitularesFlow(firmTit, TCliente);
            }
            else
            {
                succeedFlow = CreateInCore(Request, TCliente, ref customerNumber, ref response);
                if (succeedFlow)
                {

                    wasAccountInserted = AccountFlow(User, customerNumber, "PN90", "1", "CAHO", "10101010", ref response, ref cuenta);

                    if (wasAccountInserted)
                    {
                        FirmList= FirmantesTitularesFlow(firmTit, TCliente);
                        var newAddional = addition as List<AdditionalInformation>;
                        newAddional.ForEach(c => c.relatedCustomer = customerNumber);
                        processAdditional(User, customerNumber, newAddional);
                        CreateVISA(User, "0022", "CAHO", "572", customerNumber, cuenta, "Israel", "Espinoza", "none", "none", "none", "none");
                    }
                }
                if (TCliente == TipoCliente.Natural)
                {
                    if (succeedFlow)
                    {
                        nombre = response.Root.Elements().ElementAt(59).Value;
                        apellido = response.Root.Elements().ElementAt(58).Value;
                        msgList.Add("<RESUMEN><Nombre>" + nombre + "</Nombre><Apellido>" + apellido + "</Apellido><Estado>Registro exitoso</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                    }
                    else
                    {
                        nombre = requestDoc.Root.Elements().ElementAt(59).Value;
                        apellido = requestDoc.Root.Elements().ElementAt(58).Value;
                        msgList.Add("<RESUMEN><Nombre>" + nombre + "</Nombre><Apellido>" + apellido + "</Apellido><Estado>Registro No exitoso</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                    }
                }
                else
                    if (succeedFlow)
                    {
                        nombre = response.Root.Elements().ElementAt(63).Value;
                        apellido = response.Root.Elements().ElementAt(111).Value;
                        msgList.Add("<RESUMEN><NombreLegal>" + nombre + "</NombreLegal><NombreComercial>" + apellido + "</NombreComercial><Estado>Registro exitoso</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                    }
                    else
                    {
                        nombre = response.Root.Elements().ElementAt(63).Value;
                        apellido = response.Root.Elements().ElementAt(110).Value;
                        msgList.Add("<RESUMEN><NombreLegal>" + nombre + "</NombreLegal><NombreComercial>" + apellido + "</NombreComercial><Estado>Registro No exitoso</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                    }
            }
            return msgList.Concat(FirmList).ToList();
        }

        private List<string> FirmantesTitularesFlow(object firmTit, TipoCliente TCliente)
        {
            List<string> msgList = new List<string>();
            XDocument response = null;

            string customerNumber = string.Empty;
            string nombre = string.Empty;
            string apellido = string.Empty;
            bool wasSucceced = false;
            if (TCliente == TipoCliente.Natural)
            {
                try
                {
                    var result = ((IEnumerable)firmTit).Cast<IntegracionInformacionCustomerServicesCNatural>().ToList();
                    foreach (var item in result)
                    {
                        if (SearchInformation(User, item.idNumber, Country, TCliente, ref response, out customerNumber))
                        {
                            wasSucceced = UpdateInCore(Serialize<IntegracionInformacionCustomerServicesCNatural>(item), TCliente, ref response, customerNumber);
                            if (wasSucceced)
                            {
                                nombre = response.Root.Elements().ElementAt(59).Value;
                                apellido = response.Root.Elements().ElementAt(58).Value;
                                msgList.Add("<RESUMEN><Nombre>" + nombre + "</Nombre><Apellido>" + apellido + "</Apellido><Estado>Actualizacion exitosa</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                            }
                            else
                            {
                                nombre = requestDoc.Root.Elements().ElementAt(59).Value;
                                apellido = requestDoc.Root.Elements().ElementAt(58).Value;
                                msgList.Add("<RESUMEN><Nombre>" + nombre + "</Nombre><Apellido>" + apellido + "</Apellido><Estado>Actualizacion No exitosa</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                            }
                        }
                        else
                        {
                            wasSucceced = CreateInCore(Serialize<IntegracionInformacionCustomerServicesCNatural>(item), TCliente, ref customerNumber, ref response);
                            if (wasSucceced)
                            {
                                nombre = response.Root.Elements().ElementAt(59).Value;
                                apellido = response.Root.Elements().ElementAt(58).Value;
                                msgList.Add("<RESUMEN><Nombre>" + nombre + "</Nombre><Apellido>" + apellido + "</Apellido><Estado>Registro exitoso</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                            }
                            else
                            {
                                nombre = requestDoc.Root.Elements().ElementAt(59).Value;
                                apellido = requestDoc.Root.Elements().ElementAt(58).Value;
                                msgList.Add("<RESUMEN><Nombre>" + nombre + "</Nombre><Apellido>" + apellido + "</Apellido><Estado>Registro No exitoso</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {

                }
            }
            else
            {
                try
                {
                    var result = ((IEnumerable)firmTit).Cast<IntegracionInformacionCustomerServicesCJuridico>().ToList();
                    foreach (var item in result)
                    {
                        if (SearchInformation(User, item.idNumber, Country, TCliente, ref response, out customerNumber))
                        {
                            wasSucceced = UpdateInCore(Serialize<IntegracionInformacionCustomerServicesCJuridico>(item), TCliente, ref response, customerNumber);
                            if (wasSucceced)
                            {
                                nombre = response.Root.Elements().ElementAt(63).Value;
                                apellido = response.Root.Elements().ElementAt(110).Value;
                                msgList.Add("<RESUMEN><NombreLegal>" + nombre + "</NombreLegal><NombreComercial>" + apellido + "</NombreComercial><Estado>Actualizacion exitosa</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                            }
                            else
                            {
                                nombre = response.Root.Elements().ElementAt(63).Value;
                                apellido = response.Root.Elements().ElementAt(110).Value;
                                msgList.Add("<RESUMEN><NombreLegal>" + nombre + "</NombreLegal><NombreComercial>" + apellido + "</NombreComercial><Estado>Actualizacion No exitosa</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                            }
                        }
                        else
                        {
                            wasSucceced = CreateInCore(Serialize<IntegracionInformacionCustomerServicesCJuridico>(item), TCliente, ref customerNumber, ref response);
                            if (wasSucceced)
                            {
                                nombre = response.Root.Elements().ElementAt(63).Value;
                                apellido = response.Root.Elements().ElementAt(111).Value;
                                msgList.Add("<RESUMEN><NombreLegal>" + nombre + "</NombreLegal><NombreComercial>" + apellido + "</NombreComercial><Estado>Registro exitoso</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                            }
                            else
                            {
                                nombre = response.Root.Elements().ElementAt(63).Value;
                                apellido = response.Root.Elements().ElementAt(110).Value;
                                msgList.Add("<RESUMEN><NombreLegal>" + nombre + "</NombreLegal><NombreComercial>" + apellido + "</NombreComercial><Estado>Registro No exitoso</Estado><Valor>Cliente: " + customerNumber + "</Valor></RESUMEN>");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {

                }

            }

            return msgList;
        }


        private bool SearchInformation(string user, string idNumber, string idCountry, TipoCliente tipoCliente, ref XDocument _response, out string customerNumber)
        {

            Banesco.Logica.ServicesIntegracionCoreBancaria.Mensaje msg = new Banesco.Logica.ServicesIntegracionCoreBancaria.Mensaje();
            IntegracionAccountServices services = new IntegracionAccountServices();
            if (tipoCliente == TipoCliente.Natural)
            {
                IntegracionInformacionCustomerServicesCNatural response = new IntegracionInformacionCustomerServicesCNatural();
                msg = services.ConsultarInformacionClinteNaturalIBS(user, idNumber, idCountry, ref response);
                customerNumber = response.customerNumber;
                _response = Serialize<IntegracionInformacionCustomerServicesCNatural>(response);
            }

            else
            {
                IntegracionInformacionCustomerServicesCJuridico response = new IntegracionInformacionCustomerServicesCJuridico();
                msg = services.ConsultarInformacionClienteJuridicoIBS(user, idNumber, idCountry, ref response);
                customerNumber = response.customerNumber;
                _response = Serialize<IntegracionInformacionCustomerServicesCJuridico>(response);
            }

            return msg.Status.ToString() == "OK" ? true : false;


        }

        private bool CreateInCore(object request, TipoCliente tipoCliente, ref string customerNumber, ref XDocument _response)
        {
            Banesco.Logica.ServicesIntegracionCoreBancaria.Mensaje msg = new Banesco.Logica.ServicesIntegracionCoreBancaria.Mensaje();
            IntegracionAccountServices services = new IntegracionAccountServices();
            if (tipoCliente == TipoCliente.Natural)
            {
                IntegracionInformacionCustomerServicesCNatural response = new IntegracionInformacionCustomerServicesCNatural();
                TextReader tr = new StringReader(request.ToString());
                XDocument xDoc = XDocument.Load(tr);
                requestDoc = xDoc;
                IntegracionInformacionCustomerServicesCNatural requestmsg = Deserialize<IntegracionInformacionCustomerServicesCNatural>(xDoc);
                msg = services.NuevoClienteNaturalIBS(requestmsg, ref response);
                customerNumber = response.customerNumber;
                _response = Serialize<IntegracionInformacionCustomerServicesCNatural>(response);
            }
            else
            {
                IntegracionInformacionCustomerServicesCJuridico response = new IntegracionInformacionCustomerServicesCJuridico();
                TextReader tr = new StringReader(request.ToString());
                XDocument xDoc = XDocument.Load(tr);
                requestDoc = xDoc;
                IntegracionInformacionCustomerServicesCJuridico requestmsg = Deserialize<IntegracionInformacionCustomerServicesCJuridico>(xDoc);
                msg = services.NuevoClienteJuridicoIBS(requestmsg, ref response);
                customerNumber = response.customerNumber;
                _response = Serialize<IntegracionInformacionCustomerServicesCJuridico>(response);
            }
            return msg.Status.ToString() == "OK" ? true : false;
        }

        private bool UpdateInCore(object request, TipoCliente tipoCliente, ref XDocument _response, string customerNumber)
        {
            Banesco.Logica.ServicesIntegracionCoreBancaria.Mensaje msg = new Banesco.Logica.ServicesIntegracionCoreBancaria.Mensaje();
            IntegracionAccountServices services = new IntegracionAccountServices();
            if (tipoCliente == TipoCliente.Natural)
            {
                IntegracionInformacionCustomerServicesCNatural response = new IntegracionInformacionCustomerServicesCNatural();
                TextReader tr = new StringReader(request.ToString());
                XDocument xDoc = XDocument.Load(tr);
                requestDoc = xDoc;
                IntegracionInformacionCustomerServicesCNatural requestmsg = Deserialize<IntegracionInformacionCustomerServicesCNatural>(xDoc);
                requestmsg.customerNumber = customerNumber;
                msg = services.ActualizarClienteNaturalIBS(requestmsg, ref response);
                _response = Serialize<IntegracionInformacionCustomerServicesCNatural>(response);
            }
            else
            {
                IntegracionInformacionCustomerServicesCJuridico response = new IntegracionInformacionCustomerServicesCJuridico();
                TextReader tr = new StringReader(Request.ToString());
                XDocument xDoc = XDocument.Load(tr);
                requestDoc = xDoc;
                IntegracionInformacionCustomerServicesCJuridico requestmsg = Deserialize<IntegracionInformacionCustomerServicesCJuridico>(xDoc);
                requestmsg.customerNumber = customerNumber;
                msg = services.ActualizarClienteJuridicoIBS(requestmsg, ref response);
                _response = Serialize<IntegracionInformacionCustomerServicesCJuridico>(response);
            }
            return msg.Status.ToString() == "OK" ? true : false;

        }

        private bool AccountFlow(string user, string customerNumber, string productCode, string branch, string accountType, string costCenter, ref XDocument _response, ref string cuenta)
        {
            Banesco.Logica.ServicesIntegracionCoreBancaria.Mensaje msg = new Banesco.Logica.ServicesIntegracionCoreBancaria.Mensaje();
            IntegracionAccountServices services = new IntegracionAccountServices();
            AccountServicesIntegration response = new AccountServicesIntegration();

            AccountServicesIntegration requestmsg = new AccountServicesIntegration();
            requestmsg.taxesWitholdingFlag = "4";
            requestmsg.user = user;
            requestmsg.customerNumber = customerNumber;
            requestmsg.productCode = productCode;
            requestmsg.branch = branch;
            requestmsg.accountType = accountType;
            requestmsg.costCenter = costCenter;
            msg = services.AgregarNuevaCuenta(requestmsg, ref response);
            cuenta = response.accountNumber;
            _response = Serialize<AccountServicesIntegration>(response);
            return msg.Status.ToString() == "OK" ? true : false;
        }

        public bool processAdditional(string user, string customerNumber, List<AdditionalInformation> colleAdd)
        {
            IntegracionAccountServices services = new IntegracionAccountServices();
            Banesco.Logica.ServicesIntegracionCoreBancaria.Mensaje msg = new Banesco.Logica.ServicesIntegracionCoreBancaria.Mensaje();
            msg = services.AgregarAdditionalInformation(user, customerNumber, colleAdd.ToArray());
            return msg.Status.ToString() == "OK" ? true : false;
        }

        private string CreateVISA(string usuario, string canal, string producto, string sucursal, string cliente, string cuenta, string nombre, string apellido, string agua, string elektra, string edemet, string telefono)
        {


            Banesco.Logica.ServicesIntegracionVisa.VisaServiceService objVisaServicesTarjeta = new Banesco.Logica.ServicesIntegracionVisa.VisaServiceService();
            string respuesta = objVisaServicesTarjeta.getTarjetaVisa(usuario, canal, producto, sucursal, cliente, cuenta, nombre, apellido, agua, elektra, edemet, telefono);
            return respuesta;
        }

        private static T Deserialize<T>(XDocument xDoc)
        {
            XmlSerializer xmlSerial = new XmlSerializer(typeof(T));
            using (var Reader = xDoc.Root.CreateReader())
            {
                return (T)xmlSerial.Deserialize(Reader);
            }
        }

        public static XDocument Serialize<X>(X para)
        {
            XmlSerializer xmlSerial = new XmlSerializer(typeof(X));
            XDocument xDoc = new XDocument();
            using (var Writer = xDoc.CreateWriter())
            {
                xmlSerial.Serialize(Writer, para);
            }
            return xDoc;
        }

        #endregion

    }

    public enum TipoCliente
    {
        Natural = 1,
        Juridico = 2
    }

    public static class Extension
    {
        public static XmlDocument toXmlDocument(this XDocument doc)
        {
            XmlDocument xmlDoc = new XmlDocument();
            using (var Reader = doc.CreateReader())
            {
                xmlDoc.Load(Reader);
            }

            return xmlDoc;
        }
    }


}
